//package com.example.state.config;
//
//import com.example.state.consts.Events;
//import com.example.state.consts.States;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.statemachine.config.EnableStateMachine;
//import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
//import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
//import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
//import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
//import org.springframework.statemachine.listener.StateMachineListener;
//import org.springframework.statemachine.listener.StateMachineListenerAdapter;
//import org.springframework.statemachine.state.State;
//
//import java.util.EnumSet;
//
//
//@Configuration
//@EnableStateMachine
//public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {
//
//    /**
//     * 配置状态机整体的行为和特性：持久化、监听器、上下文等
//     *   上下文：ID 、上下文对象等
//     *   持久化：状态机持久化到数据库、redis 等
//     *   监听器：通过监听器，可以在状态机的各种事件（如状态变化、状态机启动和停止等）发生时执行特定的操作。
//     *   其他：配置状态机的各种全局特性，如状态机是否自动启动等。
//     */
//    @Override
//    public void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception {
//        config.withConfiguration()
//                .machineId("cc")
//                .autoStartup(true)
//                .listener(listener());
//    }
//
//    /**
//     * 配置状态机的状态
//     *  initial 状态机初始状态
//     *  states 状态机所有状态
//     *
//     *  state 定义一个普通的状态
//     *  state(S, Action, Action) 定义一个状态，并指定状态的初始化动作和状态的结束动作
//     *  end 状态机结束状态
//     *  parent 嵌套状态机中的父状态（嵌套状态机）
//     */
//    @Override
//    public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception {
//        states.withStates()
//                .initial(States.SI)
//                .states(EnumSet.allOf(States.class));
//    }
//
//    /**
//     * 配置状态机的状态转换，包括触发转换的事件、条件和动作
//     *  withExternal() 配置一个外部转换，即从一个状态转换到另一个不同的状态
//     *  withInternal() 配置一个内部转换，即在同一状态内进行的转换
//     *  withLocal()    配置一个局部转换，即在嵌套状态机中从一个子状态到另一个子状态
//     *
//     *  withFork() && withJoin() 配置并行状态的分叉和合并
//     *
//     *  source  状态机当前状态
//     *  target  状态机目标状态
//     *  event   状态机触发的事件
//     *  guard   状态转换的条件
//     *  action  状态转换的动作
//     */
//    @Override
//    public void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception {
//        transitions.withExternal()
//                .source(States.SI).target(States.S1).event(Events.E1)
//                .and()
//                .withExternal()
//                .source(States.S1).target(States.S2).event(Events.E2);
//    }
//
//
//    @Bean
//    public StateMachineListener<States, Events> listener() {
//        return new StateMachineListenerAdapter<States, Events>() {
//            @Override
//            public void stateChanged(State<States, Events> from, State<States, Events> to) {
//                System.out.println("State change to " + to.getId());
//            }
//        };
//    }
//
//}
